package com.kaikeba.service;

import com.kaikeba.bean.BootStrapTableUser;
import com.kaikeba.bean.Courier;
import com.kaikeba.bean.User;
import com.kaikeba.dao.BaseUserDao;
import com.kaikeba.dao.impl.UserDaoMysql;
import com.kaikeba.exception.DuplicateCodeException;
import com.kaikeba.util.DateFormatUtil;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author: ManolinCoder
 * @time: 2021/9/4
 */
public class UserService {
    private static BaseUserDao dao = new UserDaoMysql();
    /**
     * @return java.util.Map<java.lang.String, java.lang.Integer>
     * @Author LC
     * @Description //TODO 查询用户表中所有记录包括总数和新增（新增就是注册时间与当前时间相同）,ustatus为1的不算
     * @Date 15:00 2021/9/4
     * @Param []
     **/
    public static Map<String, Integer> console() {
        return dao.console();
    }

    /**
     * @param limit
     * @param offset
     * @param pageNumber
     * @return 用户信息集合
     * @Author LC
     * @Description //TODO 查询所有用户信息,ustatus为1的不算
     * @Date 15:01 2021/9/4
     * @Param [limit 是否分页的标记，true表示分页。false表示查询所有快递, offset SQL语句的起始索引, pageNumber 每一页查询的数量]
     */
    public static List<BootStrapTableUser> findAll(boolean limit, int offset, int pageNumber) {
        List<User> userList = dao.findAll(limit, offset, pageNumber);
        List<BootStrapTableUser> uAfterDealWithList = new ArrayList<>();
        if (userList.size() != 0){
            for (User user : userList) {
                String uInTime = DateFormatUtil.format(user.getuInTime());
                String uLastLoginTime = DateFormatUtil.format(user.getuLastLoginTime());
                BootStrapTableUser uAfterDealWith = new BootStrapTableUser(user.getId(),user.getUname(),user.getuPhoneNumber(),user.getuIdCardNum(),user.getuPassword(),uInTime,uLastLoginTime,user.getuStatus());
                uAfterDealWithList.add(uAfterDealWith);
            }
            return uAfterDealWithList;
        }
        return null;
    }

    /**
     * @param phoneNumber
     * @return 查询的用户信息，手机号不存在时返回null
     * @Author LC
     * @Description //TODO 根据用户手机号查找对应用户,ustatus为1的不算
     * @Date 15:03 2021/9/4
     * @Param [phoneNumber 用户手机号]
     */
    public static User findByPhoneNumber(String phoneNumber) {
        return dao.findByPhoneNumber(phoneNumber);
    }

    /**
     * @param phoneNumber
     * @return 查询的用户信息，手机号不存在时返回null
     * @Author LC
     * @Description //TODO 根据用户手机号查找对应用户,即使ustatus为1也查找
     * @Date 15:11 2021/9/6
     * @Param [phoneNumber 用户手机号]
     */
    public static User findUserIncludeStatusIsOneByPhoneNum(String phoneNumber) {
        return dao.findUserIncludeStatusIsOneByPhoneNum(phoneNumber);
    }

    /**
     * @param id
     * @return 查询的用户信息，id不存在时返回null
     * @Author LC
     * @Description //TODO 根据用户主键id查找对应用户,ustatus为1的不算
     * @Date 15:04 2021/9/4
     * @Param [id 用户主键id]
     */
    public static User findById(int id) {
        return dao.findById(id);
    }

    /**
     * @param u
     * @return 录入的结果, true表示成功, false表示失败
     * @Author LC
     * @Description //TODO 用户信息的录入,注意手机号不能重复
     * @Date 15:05 2021/9/4
     * @Param [u 用户信息对象]
     */
    public static boolean insert(User u){
        try {
            return dao.insert(u);
        } catch (DuplicateCodeException e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @param id
     * @param newu
     * @return 更新的结果, true表示成功, false表示失败
     * @Author LC
     * @Description //TODO 用户信息的更新
     * @Date 15:06 2021/9/4
     * @Param [id 要更新的用户d, newu 新的用户信息对象]
     */
    public static boolean update(int id, User newu) {
        //更新后的手机号没有重复才执行更新
        if (newu.getuPhoneNumber() != null){
            //用户更改了手机号，进行重复性验证（用户若未更改手机号则前台不用传递手机号）
            if (dao.findByPhoneNumber(newu.getuPhoneNumber()) == null){
                return dao.update(id,newu);
            }
        }else {
            //用户未修改手机号，前台没有传入。则查询当前id的手机号并赋给newc
            User currentU = dao.findById(id);
            newu.setuPhoneNumber(currentU.getuPhoneNumber());
            return dao.update(id, newu);
        }
        return false;
    }

    /**
     * @param id
     * @return 删除的结果, true表示成功, false表示失败
     * @Author LC
     * @Description //TODO 根据用户的id删除相应数据（假删除）
     * @Date 15:07 2021/9/4
     * @Param [id 用户的id]
     */
    public static boolean delete(int id) {
        return dao.delete(id);
    }
}
